//: enumerated/RoShamBo5.java
// Multiple dispatching using an EnumMap of EnumMaps.
package enumerated;
import java.util.*;
import static enumerated.Outcome.*;

enum RoShamBo5 implements Competitor<RoShamBo5> {

  PAPER, SCISSORS, ROCK;

  static EnumMap<RoShamBo5,EnumMap<RoShamBo5,Outcome>> table =
          new EnumMap<RoShamBo5, EnumMap<RoShamBo5,Outcome>>(RoShamBo5.class);

  static {
    for(RoShamBo5 it : RoShamBo5.values()) {
      table.put(it, new EnumMap<RoShamBo5, Outcome>(RoShamBo5.class));
    }

    initRow(PAPER, DRAW, LOSE, WIN);

    initRow(SCISSORS, WIN, DRAW, LOSE);

    initRow(ROCK, LOSE, WIN, DRAW);

  }

  static void initRow(RoShamBo5 it, Outcome vPAPER, Outcome vSCISSORS, Outcome vROCK) {

    EnumMap<RoShamBo5,Outcome> row = RoShamBo5.table.get(it);
    row.put(RoShamBo5.PAPER, vPAPER);
    row.put(RoShamBo5.SCISSORS, vSCISSORS);
    row.put(RoShamBo5.ROCK, vROCK);
  }

  public Outcome compete(RoShamBo5 it) {
    return table.get(this).get(it);
  }

  public static void main(String[] args) {

    RoShamBo.play(RoShamBo5.class, 20);
  }

} /* Same output as RoShamBo2.java *///:~
